//package com.gk.springauth2auth.config.local;
//
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.context.annotation.Primary;
//import org.springframework.http.HttpMethod;
//import org.springframework.security.authentication.AuthenticationManager;
//import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
//import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
//import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
//import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
//import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
//import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;
//import org.springframework.security.oauth2.provider.ClientDetailsService;
//import org.springframework.security.oauth2.provider.code.AuthorizationCodeServices;
//import org.springframework.security.oauth2.provider.code.InMemoryAuthorizationCodeServices;
//import org.springframework.security.oauth2.provider.token.DefaultTokenServices;
//import org.springframework.security.oauth2.provider.token.TokenEnhancerChain;
//import org.springframework.security.oauth2.provider.token.TokenStore;
//
///**
// * AuthorizationServer配置的适配类,oauth2认证服务器
// * 内存模式
// * 配置信息：
// *      客户端认证信息-令牌暴露地址以及安全约束
// *
// * @Author poison
// * @Date 2020/10/10 15:54
// */
//@Configuration
//@EnableAuthorizationServer
//public class AuthorizationServerConfigLocal extends AuthorizationServerConfigurerAdapter {
//
//
//    /**
//     * 认证管理器，密码模式需要自定义
//     */
//    @Autowired
//    private AuthenticationManager authenticationManager;
//    @Autowired
//    private AuthorizationCodeServices authorizationCodeServices;
//    @Autowired
//    private ClientDetailsService clientDetailsService;
//    @Autowired
//    private TokenStore tokenStore;
//    /**
//     * 从数据库中获取客户端信息
//     *
//     * @return
//     */
////    @Bean
////    public ClientDetailsService clientDetails() {
////        return new JdbcClientDetailsService(dataSource);
////    }
//
//    public AuthorizationServerConfigLocal() {
//        super();
//    }
//
//    /**
//     * 配置从哪里获取ClientDetails信息。
//     * 配置客户端详情信息
//     * 在client_credentials授权方式下，只要这个ClientDetails信息。
//     */
//    @Override
//    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
//        //认证信息从数据库获取
//        //clients.withClientDetails(clientDetails());
//        // 测试用，将客户端信息存储在内存中
//        clients.inMemory()
//                // client_id，其实就是客户端的代码
//                .withClient("client")
//                // client_secret，客户端密钥
//                .secret(new BCryptPasswordEncoder().encode("secret"))
//                // 客户端可以访问的资源列表，对应某一个资源服务的id，比如用户，订单
//                .resourceIds("res1")
//                // 该client允许的授权类型
//                .authorizedGrantTypes("authorization_code","password","client_credentials","implicit","refresh_token")
//                // 允许的授权范围,客户端的权限，权限标识
//                .scopes("all")
//                // 登录后绕过批准询问(/oauth/confirm_access
//                // 授权回调的地址
//                .redirectUris("http://www.baidu.com")
//                // false跳转到授权页面，true，直接发放资源请求令牌
//                .autoApprove(false) ;
//
//    }
//
//    /**
//     * <p>注意，自定义TokenServices的时候，需要设置@Primary，否则报错，</p>
//     * 令牌访问服务
//     * @return
//     */
//    @Primary
//    @Bean
//    public DefaultTokenServices defaultTokenServices() {
//        DefaultTokenServices tokenServices = new DefaultTokenServices();
//        // 客户端信息服务
//        tokenServices.setClientDetailsService(clientDetailsService);
//        // 令牌存储策略
//        tokenServices.setTokenStore(tokenStore);
//        // 令牌刷新时间
//        tokenServices.setSupportRefreshToken(true);
//        // token有效期自定义设置，默认12小时
//        tokenServices.setAccessTokenValiditySeconds(60 * 60 * 12);
//        // refresh_token默认30天
//        tokenServices.setRefreshTokenValiditySeconds(60 * 60 * 24 * 7);
//        return tokenServices;
//    }
//
//    @Override
//    /**
//     * 用来配置授权（authorization）以及令牌（token）的访问端点和令牌服务(token services)
//     * 令牌端点可理解为申请令牌的地址。令牌服务的意思就是怎么去发放令牌。
//     * 注入相关配置：
//     * 1. 密码模式下配置认证管理器 AuthenticationManager
//     * 2. 设置 AccessToken的存储介质tokenStore， 默认使用内存当做存储介质。
//     * 3. userDetailsService注入
//     */
//
//    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
//        TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();
//        endpoints
//                // token的保存方式
//                .tokenStore(tokenStore)
//                // 密码模式需要
//                .authenticationManager(authenticationManager)
//                // 允许post的提交访问令牌
//                .allowedTokenEndpointRequestMethods(HttpMethod.POST)
//                // 授权码模式需要
//                .authorizationCodeServices(authorizationCodeServices)
//                // MUST：密码模式下需设置一个AuthenticationManager对象,获取 UserDetails信息
//                //.userDetailsService(userDetailsService)
//                // token里加点信息
//                .tokenEnhancer(tokenEnhancerChain);
//        // 令牌管理服务
//        endpoints.tokenServices(defaultTokenServices());
//    }
//
//    @Bean
//    public AuthorizationCodeServices authorizationCodeServices() {
//        //设置授权码模式的授权码如何存取，暂时采用内存方式
//        return new InMemoryAuthorizationCodeServices();
//    }
//
//    /**
//     *   用来配置令牌端点(Token Endpoint)的安全约束.
//     *   配置：安全检查流程,用来配置令牌端点（Token Endpoint）的安全与权限访问
//     *   表明不是所有令牌请求都可以访问
//     * 	 默认过滤器：BasicAuthenticationFilter
//     * 	 1、oauth_client_details表中clientSecret字段加密【ClientDetails属性secret】
//     * 	 2、CheckEndpoint类的接口 oauth/check_token 无需经过过滤器过滤，默认值：denyAll()
//     * 	 对以下的几个端点进行权限配置：
//     * 	 /oauth/authorize：授权端点
//     * 	 /oauth/token：令牌端点
//     * 	 /oauth/confirm_access：用户确认授权提交端点
//     * 	 /oauth/error：授权服务错误信息端点
//     * 	 /oauth/check_token：用于资源服务访问的令牌解析端点
//     * 	 /oauth/token_key：提供公有密匙的端点，如果使用JWT令牌的话
//     */
//    @Override
//    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
//        security.allowFormAuthenticationForClients()//允许客户表单认证
//                //.checkTokenAccess("isAuthenticated()")
//                // 检测令牌，设置为公开
//                .checkTokenAccess("permitAll()")
//                .tokenKeyAccess("permitAll()");
//    }
//
//
//}
